お気持ちで理解するExtendible Effects
抽象と実装を分離したい
プログラミングにおける副作用(Effect)を代数(データ)として表現し、それを使ってプログラミングをする
データそれ自体は副作用の具体的な実行方法を持たないので、抽象の役割をする
副作用は書いたプログラムに対してハンドラを適用することで実行される
ハンドラはプログラムから副作用を表現する代数を剥がし、そこに副作用を実行して得た値を入れる(イメージ)
ハンドラは実装の役割をする
Effを構成する要素は3つ
Freerモナド
Open Union
Type-aligned Sequence
…は?
難しいので、順に解説していく
実は本質はFreerモナドだけなので、最悪それだけわかってくれればいい
Freerモナド
そもそもFreeって?
自分もよくわからない
ある構造に対して「自由に定まる」からこういう名前らしいが…
例示をしていく
Free Functor
Functor is 何
mapできるやつ
配列のmapメソッドとか使ったことある人も多いはず
では適当なコンテナF<A>があったとき、それに対してmapできるようにするにはどうしたらいいのか?
A. mapで渡された関数をひたすら合成していき、元のコンテナと一緒に保存すればいい
(ここにサンプル実装を書く)
何もしてないじゃないか!と思うかもしれないが、本当に何もしていない。ただ関数を合成しているだけ
逆に *値に対して解釈を加えることなく* mapできるようにするということに大きな意味がある
好きなだけmapした後で、解釈を決めることができる
(解釈を変化させて実行する例)
これがFree Functor
一般化すると、Freeには「解釈を後回しにして処理を進めていく」という「お気持ち」があるということがわかる
モナド is 何
"文脈付きの"値
使い古された表現ですが
そもそもこの問いが自分の身に余ると思う。お気持ちなので「自己関手の圏におけるモノイド対象」とか言ってごまかすこともできない。つら
計算をしたり、関数を呼んだり、条件分岐をしたりなどの操作をその中に閉じた状態で進めることができる
やっぱわからん
(先人の素晴らしい記事たち)
とりあえず、この記事では形式的な操作を知っておけばなんとかなる(ようにする)
pure 純粋な値をモナドの中に入った値にする(returnと呼ばれることも多い)
bind モナドとモナドを返す関数を受け取り、モナドの中の値を関数に適用して返す
(適当なモナドの実装)
じゃあFreer Monadは?
「後から解釈を付与できる」モナド
どういうこと?